//package com.ucpaas.dmp.web.controller.common;
//
//
//import com.ucpaas.paas.common.utils.DateUtils;
//import com.ucpaas.paas.common.utils.JsonUtils;
//import com.ucpaas.paas.common.utils.encrypt.EncryptUtils;
//import com.ucpaas.paas.domain.vo.ResultVO;
//import com.ucpaas.paas.service.config.FileConfig;
//import com.ucpaas.paas.service.service.MobileFileService;
//import com.ucpaas.paas.web.controller.BaseController;
//import org.apache.commons.io.FileUtils;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.commons.fileupload.FileItem;
//import org.apache.commons.fileupload.FileUploadException;
//import org.apache.commons.fileupload.disk.DiskFileItemFactory;
//import org.apache.commons.fileupload.servlet.ServletFileUpload;
//import org.slf4j.Logger;
//import org.slf4j.LoggerFactory;
//import org.springframework.beans.factory.annotation.Autowired;
//import org.springframework.stereotype.Controller;
//import org.springframework.web.bind.annotation.PostMapping;
//import org.springframework.web.bind.annotation.RequestMapping;
//import org.springframework.web.bind.annotation.ResponseBody;
//import org.springframework.web.multipart.MultipartFile;
//import org.springframework.web.multipart.MultipartHttpServletRequest;
//
//import javax.servlet.http.HttpServletRequest;
//import javax.servlet.http.HttpServletResponse;
//import java.io.*;
//import java.nio.channels.FileChannel;
//import java.util.*;
//import java.util.concurrent.ConcurrentHashMap;
//import java.util.concurrent.ConcurrentMap;
//
//@Controller
//@RequestMapping({"/chunks"})
//public class WebUploaderController extends BaseController {
//    private static final Logger logger = LoggerFactory.getLogger(WebUploaderController.class);
//    private static final long _5MB = 5242880L;
//    private static final long LIMIT_FILE_SIZE = _5MB;
//
//    private ConcurrentMap<String, String> fileCache = new ConcurrentHashMap();
//    @Autowired
//    private FileConfig fileConfig;
//
//    @Autowired
//    private MobileFileService mobileFileService;
//
//    @PostMapping({"/merge"})
//    @ResponseBody
//    public String merge(HttpServletRequest request, HttpServletResponse response) {
//        String fileName = request.getParameter("fileName");
//        String fileMd5 = request.getParameter("fileMd5");
//        String flag = request.getParameter("flag");
//        Map result = new HashMap();
//        if (StringUtils.isBlank(fileMd5)) {
//            result.put("msg", "fileMd5不能为空");
//            result.put("progress", "0");
//        } else if (StringUtils.isBlank(fileName)) {
//            result.put("msg", "fileName不能为空");
//            result.put("progress", "0");
//        }
//        if (!result.isEmpty()) {
//            return JsonUtils.toJson(result);
//        }
//        String resStr = null;
//        try {
//            String tempSavePath = getChunksTempDir(request, flag, fileMd5, fileName).toString();
//
//            logger.debug("分块临时文件目录路径 --> {}", tempSavePath);
//            File tempFileDir = new File(tempSavePath);
//            File[] fileArray = tempFileDir.listFiles(new AcceptFile());
//            List<File> fileList = Arrays.asList(fileArray);
//            Collections.sort(fileList, new CompareChunks());
//
//            String newFilePath = generateNewFilePathName(request, new Date(), fileMd5, flag, fileName);
//            File outputFile = new File(newFilePath);
//            try {
//                if (!outputFile.exists()) {
//                    outputFile.getParentFile().mkdirs();
//                }
//                outputFile.createNewFile();
//            } catch (IOException e) {
//                logger.error("创建文件异常 --> {}", e);
//            }
//
//            FileChannel outChnnel = new FileOutputStream(outputFile).getChannel();
//
//            int chunksSize = 0;
//            for (File chunkFile : fileList) {
//                FileChannel inChannel = new FileInputStream(chunkFile).getChannel();
//                try {
//                    inChannel.transferTo(0L, inChannel.size(), outChnnel);
//                    inChannel.close();
//                } catch (IOException e) {
//                    logger.error("FileChannel 合并分块文件异常 ---> {}", e);
//                }
//                long length = chunkFile.length();
//                chunksSize = (int) (chunksSize + length);
//                logger.debug("分块文件名 => {}, 大小 ==> {}", chunkFile.getName(), Long.valueOf(length));
//                chunkFile.delete();
//            }
//            try {
//                logger.debug("合并后的分块文件名 => {}, 合并文件大小 ==> {} , 每块大小合计 ==> {}", new Object[]{outputFile.getName(), Long.valueOf(outputFile.length()), Integer.valueOf(chunksSize)});
//
//                outChnnel.close();
//            } catch (IOException e) {
//                logger.error("FileChannel 关闭资源异常 ---> {}", e);
//            }
//
//            if ((tempFileDir != null) && (tempFileDir.isDirectory()) && (tempFileDir.exists())) {
//                tempFileDir.delete();
//            }
//
//            Object resultMap = new HashMap();
//
//            logger.debug("合并后保存的文件路径 ---> {}", newFilePath);
//            ((Map) resultMap).put("lastUploadTime", this.fileCache.get(getLastUploadTimeKey(flag, fileMd5, fileName)));
//            ((Map) resultMap).put("pathFileName", EncryptUtils.encodeDes3(newFilePath));
//
//            removeCacheAfterDel(flag, fileMd5, fileName);
//
//            resStr = JsonUtils.toJson(resultMap);
//        } catch (Exception e) {
//            e.printStackTrace();
//        }
//        logger.debug("resStr ---> {}", resStr);
//        return (String) resStr;
//    }
//
//    @PostMapping("/parsefile")
//    @ResponseBody
//    public ResultVO parsefile(String filePath, HttpServletRequest request) {
//        if (StringUtils.isBlank(filePath)) {
//            return ResultVO.failureWithMsg("文件路径不存在");
//        }
//        ResultVO result;
//        String sysPath = fileConfig.getFileRootPath() + fileConfig.getPhoneNumberPath();
//        try {
//            result = mobileFileService.parseMobileFile("", filePath, sysPath, sysPath);
//        } catch (Exception e) {
//            logger.error("SmsSendManageController.parsefile(),filePath:{}导入文件异常:{}", filePath, e.getMessage(), e);
//            result = ResultVO.failureWithMsg("请求超时,请稍后再试...");
//        }
//        return result;
//    }
//
//    @PostMapping({"/check"})
//    @ResponseBody
//    public String check(HttpServletRequest request, HttpServletResponse response) {
//        Calendar instance = Calendar.getInstance();
//
//        String fileName = request.getParameter("fileName");
//        String fileMd5 = request.getParameter("fileMd5");
//        String flag = request.getParameter("flag");
//
//        String chunk = request.getParameter("chunk");
//        String chunkSize = request.getParameter("chunkSize");
//        String progress = request.getParameter("progress");
//
//        if (StringUtils.isBlank(progress)) {
//            progress = "0";
//        }
//        updateCacheAfterCheck(flag, fileMd5, fileName, progress, instance.getTime());
//
//        String tempSavePath = getChunksTempDir(request, flag, fileMd5, fileName).append(File.separatorChar).append(chunk).toString();
//        logger.debug("检查上传文件临时文件夹下是否有分片文件 --> {}", tempSavePath);
//        File checkFile = new File(tempSavePath);
//
//        if ((checkFile.exists()) && (checkFile.length() == Integer.parseInt(chunkSize))) {
//            logger.debug("上传过 ---> {\"isExist\":1}");
//            return "{\"isExist\":1}";
//        }
//        logger.debug("没有上传过 ---> {\"isExist\":0}");
//        return "{\"isExist\":0}";
//    }
//
//    @PostMapping({"/file_save"})
//    @ResponseBody
//    public String fileSave(HttpServletRequest request, HttpServletResponse response) {
//        DiskFileItemFactory factory = new DiskFileItemFactory();
//        ServletFileUpload sfu = new ServletFileUpload(factory);
//        sfu.setHeaderEncoding("utf-8");
//        String fileMd5 = null;
//        String chunk = null;
//        String flag = null;
//
//        String resStr = null;
//        try {
//            List<FileItem> items = sfu.parseRequest(request);
//            MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest) request;
//            MultipartFile multipartFile = multipartRequest.getFile("file");
//
//            fileMd5 = multipartRequest.getParameter("fileMd5");
//            flag = multipartRequest.getParameter("flag");
//            chunk = multipartRequest.getParameter("chunk");
//
//            if (multipartFile.getSize() > LIMIT_FILE_SIZE) {
//                resStr = "{\"isSaved\":0,\"msg\":\"文件大小超出限制\"}";
//            }
//            String fileName = multipartFile.getOriginalFilename();
//            StringBuilder tempSavePath = getChunksTempDir(request, flag, fileMd5, fileName);
//            logger.debug("保存的分块文件夹 --> {}", tempSavePath);
//            File file = new File(tempSavePath.toString());
//            if (!file.exists()) {
//                file.mkdirs();
//            }
//            String chunksTempPath = tempSavePath.append(File.separatorChar).append(chunk).toString();
//            logger.debug("保存的分块文件路径 ---->  {}", chunksTempPath);
//            File chunkFile = new File(chunksTempPath);
//            try {
//                FileUtils.copyInputStreamToFile(multipartFile.getInputStream(), chunkFile);
//                logger.debug("分块文件名 => {}, 大小 ==> {}", chunkFile.getName(), Long.valueOf(chunkFile.length()));
//                resStr = "{\"isSaved\":1}";
//            } catch (IOException e) {
//                logger.error("拷贝分块文件异常 -- > {}", e);
//                resStr = "{\"isSaved\":0,\"msg\":\"文件保存失败\"}";
//            }
//        } catch (FileUploadException e) {
//            logger.error("文件上传中断 -- > {}", e);
//            resStr = "{\"isSaved\":0,\"msg\":\"文件大小超出限制\"}";
//        }
//
//        return resStr;
//    }
//
//    @PostMapping({"/progress"})
//    @ResponseBody
//    public String getProgress(HttpServletRequest request, String fileMd5, String flag, String fileName, String fileSize) {
//        Map result = new HashMap();
//        if (StringUtils.isBlank(fileMd5)) {
//            result.put("msg", "fileMd5不能为空");
//            result.put("progress", "0");
//        } else if (StringUtils.isBlank(fileName)) {
//            result.put("msg", "fileName不能为空");
//            result.put("progress", "0");
//        } else if (StringUtils.isBlank(fileSize)) {
//            result.put("msg", "fileSize不能为空");
//            result.put("progress", "0");
//        }
//        if (!result.isEmpty()) {
//            return JsonUtils.toJson(result);
//        }
//
//        String progress = null;
//        if ((null != fileName) && (!"".equals(fileName))) {
//            String progressKey = getProgressKey(flag, fileMd5, fileName);
//            progress = (String) this.fileCache.get(progressKey);
//        }
//
//        if (StringUtils.isBlank(progress)) {
//            Calendar instance = Calendar.getInstance();
//            instance.add(Calendar.MONTH, -1);
//            long size = Long.parseLong(fileSize);
//
//            for (int i = 0; i < 2; i++) {
//                String path = generateNewFilePathName(request, instance.getTime(), fileMd5, flag, fileName);
//                File checkFile = new File(path);
//                if ((checkFile.exists()) && (checkFile.isFile())) {
//                    long length = checkFile.length();
//                    logger.debug("查看文件上传进度前, 先检查文件是否存在,文件存在, 大小 == {}, 待上传的文件大小 == {}", Long.valueOf(length), Long.valueOf(size));
//                    if (length == size) {
//                        progress = "100";
//                        result.put("pathFileName", EncryptUtils.encodeDes3(path));
//                        break;
//                    }
//                }
//                logger.debug("查看文件上传进度前, 先检查文件是否存在, 文件不存在 ---> {}", path);
//            }
//            if (StringUtils.isBlank(progress)) {
//                progress = "0";
//            }
//        }
//
//        result.put("progress", progress);
//        String resultStr = JsonUtils.toJson(result);
//        logger.debug("查看进度 -------> {}", resultStr);
//        return resultStr;
//    }
//
//    @PostMapping({"/del_chunks"})
//    @ResponseBody
//    public String delChunks(HttpServletRequest request, String flag, String fileMd5, String fileName) {
//        Map result = new HashMap();
//        String tempSavePath = getChunksTempDir(request, flag, fileMd5, fileName).toString();
//        File tempFileDir = new File(tempSavePath);
//        boolean delete = false;
//        if ((tempFileDir != null) && (tempFileDir.exists()) && (tempFileDir.isDirectory())) {
//            try {
//                File[] fileArray = tempFileDir.listFiles();
//                for (File file : fileArray) {
//                    file.delete();
//                }
//                delete = tempFileDir.delete();
//            } catch (Exception e) {
//                logger.error("删除临时文件异常 ---> {}", e);
//                return "{\"isDeleted\":0}";
//            }
//        }
//        if (delete) {
//            removeCacheAfterDel(flag, fileMd5, fileName);
//        }
//        return "{\"isDeleted\":1}";
//    }
//
//    @RequestMapping({"/scanPic"})
//    @ResponseBody
//    public void viewEncrypt(HttpServletRequest request, HttpServletResponse response)
//    {
//        String path = StringUtils.trim(request.getParameter("path"));
//        if (StringUtils.isNotBlank(path)) {
//            WebUploaderController.view(response, EncryptUtils.decodeDes3(path));
//        }
//    }
//
//    private String getPath(HttpServletRequest request, HttpServletResponse response, String parameterName) {
//        String path = StringUtils.trim(request.getParameter(parameterName));
//        if (StringUtils.isNotBlank(path)) {
//            try {
//                path = new String(path.getBytes("iso-8859-1"), "utf-8");
//            } catch (UnsupportedEncodingException e) {
//                logger.error("文件路径编码转换失败：path=" + path, e);
//            }
//        } else {
//            String encodePath = StringUtils.trim(request.getParameter("encode_path"));
//            if (StringUtils.isNotBlank(encodePath)) {
//                path = EncryptUtils.decodeDes3(encodePath);
//            }
//        }
//        return path;
//    }
//
//    private void updateCacheAfterCheck(String flag, String fileMd5, String fileName, String progress, Date now) {
//        String progressKey = getProgressKey(flag, fileMd5, fileName);
//        String lastUploadTimeKey = getLastUploadTimeKey(flag, fileMd5, fileName);
//        String fileNameKey = getFileNameKey(flag, fileMd5, fileName);
//        this.fileCache.put(progressKey, progress);
//
//        this.fileCache.put(lastUploadTimeKey, DateUtils.format(now, DateUtils.FULL_DATE_TIME_FORMATE));
//        if (StringUtils.isBlank((CharSequence) this.fileCache.get(fileNameKey))) {
//            StringBuilder tempFile = new StringBuilder(DateUtils.format(now, DateUtils.SIMPLE_DATE_FORMATE))
//                    .append(File.separatorChar)
//                    .append(System.currentTimeMillis())
//                    .append(fileMd5);
//
//            this.fileCache.put(fileNameKey, tempFile.toString());
//        }
//    }
//
//    private void removeCacheAfterDel(String flag, String fileMd5, String fileName) {
//        String lastUploadTimeKey = getLastUploadTimeKey(flag, fileMd5, fileName);
//        String progressKey = getProgressKey(flag, fileMd5, fileName);
//        String fileNameKey = getFileNameKey(flag, fileMd5, fileName);
//
//        this.fileCache.remove(progressKey);
//        this.fileCache.remove(lastUploadTimeKey);
//        this.fileCache.remove(fileNameKey);
//    }
//
//    private String getProgressKey(String flag, String fileMd5, String fileName) {
//        return new StringBuilder(Objects.toString(flag, "")).append("progress_").append(fileMd5).append(fileName).toString();
//    }
//
//    private String getLastUploadTimeKey(String flag, String fileMd5, String fileName) {
//        return new StringBuilder(Objects.toString(flag, "")).append("lastUploadTime_").append(fileMd5).append(fileName).toString();
//    }
//
//    private String getFileNameKey(String flag, String fileMd5, String fileName) {
//        return new StringBuilder(Objects.toString(flag, "")).append("fileName_").append(fileMd5).append(fileName).toString();
//    }
//
//    private String generateNewFilePathName(HttpServletRequest request, Date dateTime, String fileMd5, String flag, String fileName) {
//        String sysPath = fileConfig.getFileRootPath() + fileConfig.getPhoneNumberPath();
//        StringBuilder newFilePath = new StringBuilder(sysPath).append(File.separatorChar)
//                .append(DateUtils.format(dateTime, DateUtils.SIMPLE_DATE_FORMATE))
//                .append(File.separatorChar);
//        if (StringUtils.isNotBlank(flag)) {
//            newFilePath.append(flag).append("$$$");
//        }
//        newFilePath.append(fileMd5).append("$$$").append(fileName);
//        logger.debug("生成的新文件的全路径 + 文件名 ---> {}", newFilePath);
//        return newFilePath.toString();
//    }
//
//    private StringBuilder getChunksTempDir(HttpServletRequest request, String flag, String fileMd5, String fileName) {
//        String sysPath = fileConfig.getFileRootPath() + fileConfig.getPhoneNumberTempPath();
//        String fileNameKey = getFileNameKey(flag, fileMd5, fileName);
//
//        StringBuilder tempSavePath = new StringBuilder(sysPath)
//                .append(File.separatorChar)
//                .append((String) this.fileCache
//                        .get(fileNameKey));
//
//        logger.debug("保存分块文件的临时文件夹 ---> {}", tempSavePath);
//        return tempSavePath;
//    }
//
//    private class AcceptFile
//            implements FileFilter {
//        private AcceptFile() {
//        }
//
//        @Override
//        public boolean accept(File pathname) {
//            return !pathname.isDirectory();
//        }
//    }
//
//    private class CompareChunks
//            implements Comparator<File> {
//        private CompareChunks() {
//        }
//
//        @Override
//        public int compare(File o1, File o2) {
//            if (Integer.parseInt(o1.getName()) < Integer.parseInt(o2.getName())) {
//                return -1;
//            }
//            return 1;
//        }
//    }
//
//    public static void view(HttpServletResponse response, String path)
//    {
//        InputStream in = null;
//        OutputStream out = null;
//        try {
//            in = new FileInputStream(path);
//            out = new BufferedOutputStream(response.getOutputStream());
//            byte[] buffer = new byte[16384];
//            int len = 0;
//            while ((len = in.read(buffer)) > 0) {
//                out.write(buffer, 0, len);
//            }
//            out.flush();
//        }
//        catch (FileNotFoundException e) {
//            logger.debug("查看文件【文件不存在】：path=" + path);
//        } catch (IOException e) {
//            logger.error("查看文件【失败】：path=" + path, e);
//        } finally {
//            try {
//                if (in != null) {
//                    in.close();
//                }
//                if (out != null) {
//                    out.close();
//                }
//            } catch (IOException e) {
//                logger.error("关闭文件【失败】：path=" + path, e);
//            }
//        }
//    }
//}